package com.example.shuiyin.service;

import com.example.shuiyin.dto.BatchProcessRequest;
import com.example.shuiyin.dto.ProcessResultDto;
import com.example.shuiyin.dto.TaskStatusDto;
import com.example.shuiyin.dto.UploadResultDto;
import com.example.shuiyin.dto.WatermarkAddRequest;
import com.example.shuiyin.dto.WatermarkRemoveRequest;
import com.example.shuiyin.dto.watermark.WatermarkHistoryResponse;
import com.example.shuiyin.entity.WatermarkRecord;
import com.example.shuiyin.dto.WatermarkProcessRequest;
import com.example.shuiyin.dto.watermark.WatermarkTaskResult;
import com.example.shuiyin.dto.watermark.TaskStatusResult;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 水印处理服务
 */
public interface WatermarkService {

    /**
     * 上传图片
     */
    UploadResultDto uploadImage(MultipartFile file, Long userId) throws IOException;

    /**
     * 添加水印
     */
    ProcessResultDto addWatermark(WatermarkAddRequest request, Long userId);

    /**
     * 去除水印
     */
    ProcessResultDto removeWatermark(WatermarkRemoveRequest request, Long userId);

    /**
     * 批量处理
     */
    String batchProcess(BatchProcessRequest request, Long userId);

    /**
     * 获取任务状态
     */
    TaskStatusDto getTaskStatus(String taskId, Long userId);

    /**
     * 获取处理结果文件
     */
    Resource getProcessResultFile(String resultId, Long userId);

    /**
     * 获取处理结果文件名
     */
    String getProcessResultFilename(String resultId);

    /**
     * 获取用户水印历史记录
     */
    List<WatermarkHistoryResponse> getUserWatermarkHistory(Long userId, int page, int size);

    /**
     * 获取认证服务
     */
    AuthService getAuthService();

    /**
     * 将Map转换为WatermarkAddRequest对象
     */
    WatermarkAddRequest convertToAddRequest(Map<String, Object> requestMap);

    /**
     * 将Map转换为WatermarkRemoveRequest对象
     */
    WatermarkRemoveRequest convertToRemoveRequest(Map<String, Object> requestMap);

    /**
     * 将Map转换为BatchProcessRequest对象
     */
    BatchProcessRequest convertToBatchRequest(Map<String, Object> requestMap);

    /**
     * 获取用户的水印处理历史记录
     * @param userId 用户ID
     * @return 水印处理历史记录列表
     */
    List<WatermarkRecord> getWatermarkHistoryByUserId(Long userId);

    /**
     * 创建处理任务
     */
    WatermarkTaskResult createProcessTask(Long userId, WatermarkProcessRequest request);

    /**
     * 获取任务状态
     */
    TaskStatusResult getTaskStatus(Long userId, String taskId);

    /**
     * 上传图片并添加水印
     *
     * @param file          文件
     * @param text          水印文本
     * @param position      水印位置
     * @param fontSize      字体大小
     * @param fontColor     字体颜色
     * @param opacity       透明度
     * @param userId        用户ID
     * @return 处理后的文件ID
     * @throws IOException 处理异常
     */
    String processImageWatermark(MultipartFile file, String text, String position, Integer fontSize, 
            String fontColor, Float opacity, Long userId) throws IOException;
    
    /**
     * 上传视频并添加水印
     *
     * @param file          文件
     * @param text          水印文本
     * @param position      水印位置
     * @param fontSize      字体大小
     * @param fontColor     字体颜色
     * @param opacity       透明度
     * @param userId        用户ID
     * @return 任务ID
     * @throws IOException 处理异常
     */
    String processVideoWatermark(MultipartFile file, String text, String position, Integer fontSize, 
            String fontColor, Float opacity, Long userId) throws IOException;
    
    /**
     * 上传音频并添加水印
     *
     * @param file          文件
     * @param text          水印文本
     * @param position      水印位置
     * @param fontSize      字体大小
     * @param fontColor     字体颜色
     * @param opacity       透明度
     * @param userId        用户ID
     * @return 任务ID
     * @throws IOException 处理异常
     */
    String processAudioWatermark(MultipartFile file, String text, String position, Integer fontSize, 
            String fontColor, Float opacity, Long userId) throws IOException;
    
    /**
     * 上传PDF并添加水印
     *
     * @param file          文件
     * @param text          水印文本
     * @param position      水印位置
     * @param fontSize      字体大小
     * @param fontColor     字体颜色
     * @param opacity       透明度
     * @param userId        用户ID
     * @return 处理后的文件ID
     * @throws IOException 处理异常
     */
    String processPdfWatermark(MultipartFile file, String text, String position, Integer fontSize, 
            String fontColor, Float opacity, Long userId) throws IOException;
    
    /**
     * 创建水印处理任务
     * 
     * @param request 水印处理请求
     * @param userId 用户ID
     * @return 任务结果
     */
    com.example.shuiyin.dto.watermark.WatermarkTaskResult createWatermarkTask(WatermarkProcessRequest request, Long userId);
    
    /**
     * 获取任务状态
     * 
     * @param taskId 任务ID
     * @return 任务状态
     */
    com.example.shuiyin.dto.watermark.TaskStatusResult getTaskStatus(String taskId);
} 